#ifndef SCANCAMERACONTROLSDK_H
#define SCANCAMERACONTROLSDK_H

#include "ControlModuleSDKInterface.h"
#include <QMap>
#include <QWidget>
#include <QDialog>
#include "ScanCameraDevice.h"
#include "ControlModuleParametersWidget.h"
#include "SKFunctionSet.h"
#include "ScanControlPresetDialog.h"

/**
 * @brief 扫描相机控制模块SDK的具体实现类
 * @details 继承自ControlModuleSDKInterface，负责创建、管理和释放ScanCameraDevice实例
 * 处理设备连接、参数设置和状态查询等功能，并转发操作给具体的设备实例
 */
class ScanCameraControlSDK : public ControlModuleSDKInterface {
    Q_OBJECT
    Q_INTERFACES(SDKInterface)
    Q_PLUGIN_METADATA(IID SDKINTERFACE_IID)
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针（默认nullptr）
     */
    explicit ScanCameraControlSDK(QObject *parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~ScanCameraControlSDK() override;

    /**
     * @brief 获取SDK名称
     * @return 字符串"ScanCameraControlSDK"
     */
    QString sdkName() const override;

    /**
     * @brief 获取SDK版本号
     * @return 版本号字符串
     */
    QString SDKVersion() const override;

    /**
     * @brief 打开设备连接
     * @param params 连接参数，通常为设备IP地址
     * @return 连接成功返回true，失败返回false
     */
    bool openDevice(const QVariant& params) override;

    /**
     * @brief 关闭指定设备连接
     * @param params 设备标识参数，通常为设备IP地址
     */
    void closeDevice(const QVariant& params) override;

    /**
     * @brief 关闭所有设备连接
     */
    void closeAllDevices() override;

    /**
     * @brief 搜索可用设备
     * @param devices 输出参数，用于存储搜索到的设备列表
     * @return 搜索成功返回true，未找到设备返回false
     */
    bool searchDevices(QList<QVariant>& devices) override;

    /**
     * @brief 设置控制模块参数
     * @param deviceId 设备ID
     * @param paramName 参数名称
     * @param paramValue 参数值
     * @return 设置成功返回true，失败返回false
     */
    /**
     * @brief 获取快速参数设置Widget
     * @param deviceId 设备ID
     * @param parent 父Widget
     * @return 快速参数设置Widget指针
     */
    QWidget* getQuickParametersWidget(const QVariant& deviceId, QWidget* parent = nullptr) override;

    /**
     * @brief 获取参数设置对话框
     * @param deviceId 设备ID
     * @param parent 父Widget
     * @return 参数设置对话框指针
     */
    QDialog* getParametersDialog(const QVariant& deviceId, QWidget* parent = nullptr) override;

    /**
     * @brief 获取预设参数设置对话框
     * @param deviceId 设备ID
     * @param parent 父Widget
     * @return 预设参数设置对话框指针
     */
    QDialog* getPresetParametersDialog(QWidget* parent = nullptr) override;
    
    /**
     * @brief 设置设备触发模式
     * @param deviceId 设备ID
     * @param triggerMode 触发模式，使用TRIGGER_MODE_*宏定义
     * @return 设置成功返回true，失败返回false
     */
    bool setDeviceTriggerMode(const QVariant& deviceId, int triggerMode) override;
    
    /**
     * @brief 设置设备参数
     * @param deviceId 设备ID
     * @param params 设备参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    bool setDeviceParameters(const QVariant& deviceId, const QVariantMap& params) override;
    
    /**
     * @brief 获取设备参数
     * @param deviceId 设备ID
     * @param configName 配置名称输出
     * @param params 设备参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    bool getDeviceParameters(const QVariant& deviceId, QString& configName, QVariantMap& params) override;
    
    /**
     * @brief 设置预设参数
     * @param params 预设参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    bool setPresetParameters(const QVariantMap& params) override;
    
    /**
     * @brief 获取预设参数
     * @param configName 配置名称输出
     * @param params 预设参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    bool getPresetParameters(QString& configName, QVariantMap& params) override;

private:
    /**
     * @brief 建立 QuickParametersWidget 与 arametersDialog 同步参数连接
     */
    void syncParametersConnect();

private:
    struct ScanCameraDeviceInfo
    {
        // 设备对象
        ScanCameraDevice* pDevice;
        // 快捷参数设置
        ControlModuleParametersWidget* pParametersWidget;
        // 参数设置对话框
        SKFunctionSet* pParametersDialog;
    };
    // 存储设备实例的映射表，键为设备标识符（通常是串口名称）
    QMap<QString, ScanCameraDeviceInfo> m_deviceMap;
    //当前打开的设备
    QVariant m_coverOpenDevice = "";
    // 预设参数对话框
    ScanControlPresetDialog* m_pScanControlPresetDialog;
};

#endif // SCANCAMERACONTROLSDK_H
